import axios, {
    AxiosError,
    AxiosInstance,
    AxiosRequestHeaders,
    AxiosResponse,
    InternalAxiosRequestConfig,
} from 'axios'
import qs from 'qs'
import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
import { config } from './config'
import errorCode from './errorCode'

const { result_code, base_url, request_timeout } = config
// 需要忽略的提示。忽略后，自动 Promise.reject('error')
const ignoreMsgs = [
    '无效的刷新令牌', // 刷新令牌被删除时，不用提示
    '刷新令牌已过期', // 使用刷新令牌，刷新获取新的访问令牌时，结果因为过期失败，此时需要忽略。否则，会导致继续 401，无法跳转到登出界面
]
// 是否显示重新登录
export const isRelogin = { show: false }
// 请求队列
let requestList: any[] = []
// 是否正在刷新中
let isRefreshToken = false
// 请求白名单，无须token的接口
const whiteList: string[] = ['/login', '/refresh-token']
// 创建axios实例
const service: AxiosInstance = axios.create({
    baseURL: base_url, // api 的 base_url
    timeout: request_timeout, // 请求超时时间
    withCredentials: false, // 禁用 Cookie 等信息
})
/**
 * 请求前拦截
 */
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 是否需要设置 token
        let isToken = (config!.headers || {}).isToken === false
        whiteList.some((v) => {
            if (config.url) {
                config.url.indexOf(v) > -1
                return (isToken = false)
            }
        })
        //请求TOKEN
        // if (getAccessToken() && !isToken) {
        //     ;(config as Recordable).headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token
        // }
        //租户
        // if (tenantEnable && tenantEnable === 'true') {
        //     const tenantId = getTenantId()
        //     if (tenantId) (config as Recordable).headers['tenant-id'] = tenantId
        // }
        const params = config.params || {}
        const data = config.data || false
        if (
            config.method?.toUpperCase() === 'POST' &&
            (config.headers as AxiosRequestHeaders)['Content-Type'] ===
                'application/x-www-form-urlencoded'
        ) {
            config.data = qs.stringify(data)
        }
        if (config.method?.toUpperCase() === 'GET' && params) {
            config.params = {}
            const paramsStr = qs.stringify(params, { allowDots: true })
            if (paramsStr) {
                config.url = config.url + '?' + paramsStr
            }
        }
        return config
    },
    (error: AxiosError) => {
        // Do something with request error
        Promise.reject(error)
    },
)

//请求后拦截
service.interceptors.response.use(
    async (response: AxiosResponse<any>) => {
        let { data } = response

        return data
    },
    (error: AxiosError) => {
        let { message } = error
        ElMessage.error(message)
        return Promise.reject(error)
    },
)
// const refreshToken = async () => {
//     axios.defaults.headers.common['tenant-id'] = getTenantId()
//     return await axios.post(base_url + '/system/auth/refresh-token?refreshToken=' + getRefreshToken())
// }
export { service }
